Добрый день! Создаю что-то на подобие чата - вывод комментариев пользователей к товару на страницах интернет-магазина. Реализую вывод записей на клиенте с помощью AJAX, но не могу разобраться как выводить на страницу не все записи из таблицы подряд, а по определенному параметру. То есть у меня есть таблица с вот такой структурой:

в ней есть столбец "key_c" в котором и содержится параметр, который и должен являться переселяющим для вывода записей на ту или иную страницу. Этот параметр, берется из последнего параметра ссылки. Например товар к которому был оставлен комментарий находиться по ссылке: ../product/imy_tovara_2, значит в таблице, в строке с этим отзывом, значение "key_c" будет imy_tovara_2.
Соответственно, при выборе данных из таблицы, мне нужно каким-то образом учитывался это параметр, и в итоге было вот так:
1) ../product/imy_tovara_2 - выводятся только те комментарии в которых есть параметр "key_c" со значением imy_tovara_2;
2) ../product/imy_tovara_3 - выводятся только те комментарии в которых есть параметр "key_c" со значением imy_tovara_3;
3) и т.д.
Сейчас же у меня к сожалению на все страницы с товарами выводятся все записи из таблицы с отзывами.
Реализовано у меня все следующим образом:
1) Вот разметка блока в который выводятся комментарии:
<div class="feedback-content row pagination-page"> // родитель в который заноситься информация полученная из таблицы
<div class="page-anchor"></div> // все записи добавляются после этого блока
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 text-right feedback-nav"> // родитель пагинатора
<nav> // сам пагинатор
<ul class="pagination"></ul>
</nav>
</div>
</div>
2) Вот разметка формы с помощью которой создаются комментарии:
<form id="feedback_form" method="post" action="/main_c/add_comments" >
<input type="name" name="comments_name" class="validate-usser" placeholder="Ваше имя *">
<input type="email" name="comments_email" class="validate-usser" placeholder="Ваше Email *">
<input type="hidden" name="comments_key"> // в value этого импута, скрипт заносит параметр "key_c"
<textarea name="comments_feedback" class="validate-usser" placeholder="Текст отзыва *"></textarea>
<button type="submit" class="btn btn-7 btn-7h icon-envelope">Оставить отзыв</button> </form>
3) Вот контроллер и модель на сервере которые принимают данные из формы и заносят их в таблицу:
// КОНТРОЛЛЕР
function add_comments() {
$comments['name'] = $_POST['comments_name'];
$comments['email'] = $_POST['comments_email'];
$comments['feedback'] = $_POST['comments_feedback'];
$comments['key_c'] = $_POST['comments_key'];
$comment_id = $this->main_model->new_comments($comments);
$comment = array();
if ($comment_id){
$comment = $this->main_model->get_comments_limit(0,1);
}
echo json_encode($comment);
}
// МОДЕЛЬ
function new_comments($comments){
$array = array(
'date' => date("Y-m-d H:i:s", time()),
'name' => $comments['name'],
'email' => $comments['email'],
'feedback' => $comments['feedback'],
'key_c' => $comments['key_c']
);
$this->db->insert('comments', $array);
return $this->db->insert_id();
}
4) Вот скрипты которые участвуют в работе:
// здесь определяется "хвост"(последний параметр) ссылки и заноситься в импут формы которую я указал выше
$(function(){
var key_c = $('[name=comments_key]'),
url = document.location.pathname;
key_c.val(url.split('/')[2]);
});
var comment_limit = 3; // это переменная для пагинации, которая задаёт количество записей на одной странице, в данном случаи 3 записи на одной странице
$(function(){
load_comments();
$(".feedback-content").delegate("nav li a", "click", function(){ // здесь происходит переключение страниц пагинатора
var page = parseInt($(this).closest('li').attr('p')) || 0;
load_comments(page);
return false;
})
});
function load_comments(page){ // это ajax который и выводит все подряд записи из таблицы
$.ajax({
url: '/main_c/loadComments',
type: 'POST',
data: {
page: page || 0,
limit: comment_limit,
},
dataType: 'json',
})
.done(function(result){
if (result.is_ok){
create_nav(result.nav);
create_comments(result.comments, true);
}
});
}
function create_comments(comments, is_remove){ // здесь задаются параметры вывода записей на страницу
if (is_remove){
$(".feedback-content .row.feedback__client").remove();
}
for (var n in comments){
var comment = create_comment(comments[n]);
if (is_remove){
comment.appendTo($(".feedback-content"));
$(".feedback-content").append($(".feedback-nav"));
}else{
comment.insertAfter($(".page-anchor"));
}
}
}
function create_comment(comment){ // здесь создается разметка блока с записью, параметры полученные из таблицы вставлены как ' + comment.name + ', ' + comment.date + ' и т.д.
var comment = $(
'<div class="row feedback__client">'
+ '<div class="col-lg-10 col-md-10 col-sm-8 col-xs-12 viwe__feedback">'
+ '<div class="row">'
+ '<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 title__feedback">'
+ '<span>' + comment.name + '</span><span> / </span><span>' + comment.email + '</span><span class="data__time">' + comment.date + '</span>'
+ '</div>'
+ '</div>'
+ '<div class="row">'
+ '<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 txt__feedback">'
+ '<span>' + comment.feedback + '</span>'
+ '</div>'
+ '</div>'
+ '</div>'
+'</div>'
);
return comment;
}
function create_nav(nav){ // здесь задаётся разметка и функциональность пагинатора
var ul = $(".feedback-content nav ul");
if (!ul.find('li').length){
var max = Math.ceil(nav.max / comment_limit);
for (var p=0; p<max; p++){
var li = $("<li>").attr('p', p).appendTo(ul);
$("<a>").attr('href', '#').html(p + 1).appendTo(li);
}
}
ul.find('li.active').removeClass('active');
ul.find('li[p="'+nav.page+'"]').addClass('active');
}
$("form#feedback_form").submit(function(e){ // это обработчик формы которая создает комментарий
e.preventDefault();
var f = this,
data = $(f.elements),
s = $(f.elements).last(),
e = s.end().slice(0, -2).removeClass('input-error').filter(function() {
return !$.trim(this.value)
});
if(e.length) s.addClass('btn-error'), e.addClass('input-error'), setTimeout(function () {s.removeClass('btn-error')}, 1500);
else {
s.prop('disabled', 1);
s.end().not(s);
$.ajax({
url: f.action,
type: 'POST',
data: data,
dataType: 'json',
success: function(data) {
setTimeout(function () {
create_comments(data); // здесь происходит моментальный вывод комментария на страницу в случаи успешного выполнения скрипта
}, 1500);
f.reset();
s.prop('disabled', 0);
s.removeClass('btn-error');
s.addClass('btn-success');
e.removeClass('input-error');
setTimeout(function () {
s.removeClass('btn-success');
$('body').animate({
scrollTop:$('.page-anchor:first').offset().top
},500);
}, 1000);
},
error: function (){
s.addClass('btn-error');
s.prop('disabled', 0);
setTimeout(function () {
s.removeClass('btn-error');
}, 2000);
}
});
}
});
5) Вот контроллер и модель к которым обращается AJAX при выводе записей из таблицы:
// КОНТРОЛЛЕР
function loadComments() {
$page = isset($_POST['page']) ? (int)$_POST['page'] : 0;
$limit = isset($_POST['limit']) ? (int)$_POST['limit'] : 3;
$answer = new stdClass();
$err = array();
$answer->nav = new stdClass();
$answer->nav->page = $page;
$answer->nav->max = $this->db->count_all('comments');
if ($page * $limit <= $answer->nav->max){
$answer->comments = $this->main_model->get_comments_limit($page, $limit);
}
$answer->is_ok = !count($err);
$answer->err = $err;
echo json_encode($answer);
}
// МОДЕЛЬ
function get_comments_limit($page=0, $limit=3){
$this->db->order_by("id", "desc");
$query = $this->db->get('comments', $limit, $page * $limit);
return $query->result_array();
}
Я прошу прощения за столь большое количество кода в вопросе, но я не имел представление как по другому раскрыть свой вопрос.
Все что я выше написал, работает как часики, но из таблицы выводятся все подряд записи. Прошу помочь, разобраться как вывести только те которые содержат нужный параметр "key_c". Потому как я в растерянности, даже не понимаю что гуглить.
Заранее благодарен за любую помощь.